// 代理对象 proxy

const person = {
    name: 'zec',
    age: 20
}

// const personProxy = new Proxy(person, {
//     get(target, property) {
//         // console.log(target, property);
//         // return 100
//         return property in target ? target[property] : "default"
//     },
//     set(target, property, value) {
//         if (property === 'age') {
//             if (!Number.isInteger(value)) {
//                 throw new TypeError(`$value is not an int`);
//             }
//         }

//         target[property] = value;
//     }
// })

// personProxy.age = 100;
// personProxy.gender = true;
// console.log(personProxy.name);
// console.log(personProxy.xxx);


/**
 * proxy vs defineProperty
 * defineProperty 只能监视属性的读写
 * proxy 能够监视到更多对象操作
 * proxy 更好的支持数组对象的监视
 * proxy 是以非侵入的方式监管了对象的读写
 */


const personProxy = new Proxy(person, {
    deleteProperty(target, property) {
        console.log('delete', property);
        delete target[property]
    }
})

delete personProxy.age;
console.log(person);


// 如何使用Proxy对数组进行监视

const list = [];
const listProxy = new Proxy(list, {
    set(target, property, value) {
        console.log('set', property, value);
        target[property] = value;
        return true; //表示设置成功
    }
})
listProxy.push(100)
listProxy.push(100)
listProxy.push(100)
